package common;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;


/**
 * Służy do gromadzenia najlepszych do tej pory znalezionych rozwiązań.
 */
public class NonDominatedAgentsAggregator<Genotype,T extends BasicAgent<Genotype>> {
    
    protected List<T> agents = new LinkedList<T>();
    
    public void addAgent(T newAgent) {
        
        boolean isNotDominated = true;
          
        Iterator<T> agentsIter = agents.iterator();
        while(agentsIter.hasNext()) {
            T agent = agentsIter.next();
            
            int dominaiton = agent.checkDomination(newAgent);
            if (dominaiton == 1) {
                // agent jest zdominowany przez innego, więc nie zostaje dodany do elitarnej wyspy, a z rodzimej został  usunięty, więc umiera
                isNotDominated = false;
                break;
            }
            else if (dominaiton == -1) {
                // agent dominuje jakiegoś agenta elitarnego, zostaje więc dodany a tamten usunięty
                agentsIter.remove();
            }
        }
        if (isNotDominated) {
            
            // sprawdzam czy nie ma duplikatow
            
            for (BasicAgent<Genotype> agent : agents) {
                if (GeneticHelper.isDuplicate(agent,newAgent,0.00001) == true) {
                    /*
                        System.out.println("DUPLIKAT ");
                        System.out.println("agent    = "+agent.getGenotype());
                        System.out.println("newAgent = "+newAgent.getGenotype());
                     */
                    return;
                }
            }
            agents.add(newAgent);
        }
    }
    
    public void addAllAgents(List<T> agents) {
        
        for (T agent : agents) {
            addAgent(agent);
        }
    }
    
    public List<T> getAgents() {
        return new ArrayList<T>(this.agents);
    }
}
